package com.xgzit.xgzmall.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.xgzit.common.constant.AuthServerConstant;
import com.xgzit.common.utils.HttpUtils;
import com.xgzit.common.utils.R;
import com.xgzit.common.vo.MemberEntityVo;
import com.xgzit.xgzmall.auth.feign.MemberFeignService;
import com.xgzit.xgzmall.auth.vo.SocialUserVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;

/**
 * 处理社交登录请求
 * @Author xgz
 * @Date 2021-06-05 14:38
 */
@Slf4j
@Controller
public class Oauth2Controller {

    @Autowired
    MemberFeignService memberFeignService;

    @GetMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code") String code, HttpSession session, HttpServletResponse response) {
        // 根据code换取 access_token;
        // 登录成功 跳去首页
        HashMap<String, String> map = new HashMap<>(6);
        map.put("client_id", "YOUR_CLIENT_ID");
        map.put("client_secret", "YOUR_CLIENT_SECRET");
        map.put("grant_type", "authorization_code");
        map.put("redirect_uri", "http://auth.xgzmall.com/oauth2.0/weibo/success");
        map.put("code", code);
        try {
            HttpResponse weiBoResponse = HttpUtils.doPost("api.weibo.com", "oauth2/access_token", "post", null, null, map);
            // 处理 响应，拿到返回的 access_token 调用 获取用户信息接口 获取信息
            if(weiBoResponse.getStatusLine().getStatusCode()==200){
                // 获取到了access_token  EntityUtils 可以将响应的实体变成json字符串
                String json = EntityUtils.toString(weiBoResponse.getEntity());
                SocialUserVo user = JSON.parseObject(json, SocialUserVo.class);
                // 如果这个用户是第一次 进来，就自动为他注册。如果不是，直接登录
                // 调用远程 方法进行 社交登录
                R r = memberFeignService.oauth2login(user);
                if (r.getCode()==0){
                    MemberEntityVo data = r.getData(new TypeReference<MemberEntityVo>() {
                    });
                    log.info("用户信息：{}", data);
                    // 第一次使用session; 命令浏览器保存 cookie，以后浏览器访问这个网站就会带上cookie
                    // 解决 子域 之间 cookie 共享 xgzmall.com【auth.xgzmall.com、member.xgzmall.com、search.xgzmall.com】
                    // todo 默认的session 命令浏览器保存的cookie 作用域是当前域，不能用于子域。
                    // todo 默认使用jdk序列化方式，希望使用json序列化方式来序列化对象
                    session.setAttribute(AuthServerConstant.LOGIN_USER, data);
//                    new Cookie("JSESSIONID","data").setDomain()
//                    response.addCookie();
                    return "redirect:http://xgzmall.com";
                }
                // 不成功！
                return "redirect:http://auth.xgzmall.com/login.html";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "redirect:http://auth.xgzmall.com/login.html";
        }
        // 登录成功 就跳转到首页
        return "redirect:http://xgzmall.com";
    }
}
